package demo02;


import jdk.nashorn.internal.ir.CallNode;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Test1 {
    public static void main(String[] args) {
        //并发：多线程操作同一个资源类
        Ticket2 ticket = new Ticket2();
       /*
        new Runnable()看源码可以发现他是一个@FunctionalInterface函数式接口，接口不能实例化，
        但是可以用匿名内部类实现他，但是这个比价繁琐，
        所以在jdk1.8,可以使用lambdas表达式(参数)->{代码}实现。
        */
       /*
       new Thread(new Runnable(){
              @Override
              public void run(){

              }
          }).start();
       */
        new Thread(() ->{ for (int i = 1; i <40 ; i++)ticket.sale(); },"A").start();
        new Thread(() ->{ for (int i = 1; i <40 ; i++)ticket.sale(); },"B").start();
        new Thread(() ->{ for (int i = 1; i <40 ; i++)ticket.sale(); },"C").start();
    }
}
// 资源类 OOP
// 不再使用synchronized实现多线程，而是使用Lock锁。
/*lock三部曲
1、new ReentrantLock();
2、lock.lock();
3、finally=>lock.unlock();
*/

class Ticket2 {
            //属性、方法
            private int number = 30;
            Lock lock = new ReentrantLock();
            //卖票的方式
            public  void sale() {
//                执行之前加锁，执行完毕解锁
                lock.lock();
//try-catch-finally：Ctrl+Alt+T
                try {
//                   业务代码
                    if (number > 0) {
                        System.out.println(Thread.currentThread().getName() + "卖出了第" + (number--) + "张票剩余" + number + "张票");
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();//解锁
                }
            }
        }

